BIND(2) | п═я┐п╨п╬п╡п╬п╢я│я┌п╡п╬ п©я─п╬пЁя─п╟п╪п╪п╦я│я┌п╟ Linux | BIND(2) |
п≤п°п╞¶
bind - п©я─п╦п╡я▐п╥п╟я┌я▄ п╦п╪я▐ п╨ я│п╬п╨п╣я┌я┐
п·п▒п≈п·п═¶
#include <sys/types.h> /* п║п╪. п≈п░п°п∙п╖п░п²п≤п╞ */ #include <sys/socket.h> int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
п·п÷п≤п║п░п²п≤п∙¶
п÷п╬я│п╩п╣ я│п╬п╥п╢п╟п╫п╦я▐ я│п╬п╨п╣я┌п╟ я│ п©п╬п╪п╬я┴я▄я▌ socket(2), п╬п╫ п©п╬я▐п╡п╩я▐п╣я┌я│я▐ п╡ п╟п╢я─п╣я│п╫п╬п╪ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╣ (я│п╣п╪п╣п╧я│я┌п╡п╣ п╟п╢я─п╣я│п╬п╡), п╫п╬ п╠п╣п╥ п╫п╟п╥п╫п╟я┤п╣п╫п╫п╬пЁп╬ п╟п╢я─п╣я│п╟. bind() п╫п╟п╥п╫п╟я┤п╟п╣я┌ п╟п╢я─п╣я│, п╥п╟п╢п╟п╫п╫я▀п╧ п╡ addr, я│п╬п╨п╣я┌я┐, я┐п╨п╟п╥я▀п╡п╟п╣п╪п╬п╪я┐ п╢п╣я│п╨я─п╦п©я┌п╬я─п╬п╪ я└п╟п╧п╩п╟ sockfd. п▓ п╟я─пЁя┐п╪п╣п╫я┌п╣ addrlen п╥п╟п╢п╟я▒я┌я│я▐ я─п╟п╥п╪п╣я─ я│я┌я─я┐п╨я┌я┐я─я▀ п╟п╢я─п╣я│п╟ (п╡ п╠п╟п╧я┌п╟я┘), п╫п╟ п╨п╬я┌п╬я─я┐я▌ я┐п╨п╟п╥я▀п╡п╟п╣я┌ addr. п▓ я│п╦п╩я┐ я┌я─п╟п╢п╦я├п╦п╦, я█я┌п╟ п╬п©п╣я─п╟я├п╦я▐ п╫п╟п╥я▀п╡п╟п╣я┌я│я▐ “п©я─п╦я│п╡п╟п╦п╡п╟п╫п╦п╣ я│п╬п╨п╣я┌я┐ п╦п╪п╣п╫п╦”.
п·п╠я▀я┤п╫п╬, я│п╬п╨п╣я┌я┐ я┌п╦п©п╟ SOCK_STREAM п╫я┐п╤п╫п╬ п╫п╟п╥п╫п╟я┤п╦я┌я▄ п╩п╬п╨п╟п╩я▄п╫я▀п╧ п╟п╢я─п╣я│ я│ п©п╬п╪п╬я┴я▄я▌ bind() п╢п╬ я┌п╬пЁп╬, п╨п╟п╨ п╬п╫ я│п╪п╬п╤п╣я┌ п©я─п╦п╫п╦п╪п╟я┌я▄ я│п╬п╣п╢п╦п╫п╣п╫п╦я▐ (я│п╪. accept(2)).
п÷я─п╟п╡п╦п╩п╟, п╦я│п©п╬п╩я▄п╥я┐п╣п╪я▀п╣ п©я─п╦ п©я─п╦п╡я▐п╥п╨п╣ п╦п╪я▒п╫, п╬я┌п╩п╦я┤п╟я▌я┌я│я▐ п╡ я─п╟п╥п╫я▀я┘ я│п╣п╪п╣п╧я│я┌п╡п╟я┘ п╟п╢я─п╣я│п╬п╡. п÷п╬п╢я─п╬п╠п╫п╬я│я┌п╦ я│п╪. п╡ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╣п╪ я│п©я─п╟п╡п╬я┤п╫п╦п╨п╣ п╡ я─п╟п╥п╢п╣п╩п╣ 7. п·п©п╦я│п╟п╫п╦п╣ AF_INET п╫п╟я┘п╬п╢п╦я┌я│я▐ п╡ ip(7), AF_INET6 п╡ ipv6(7), AF_UNIX п╡ unix(7), AF_APPLETALK п╡ ddp(7), AF_PACKET п╡ packet(7), AF_X25 п╡ x25(7), п╟ AF_NETLINK п╡ netlink(7).
п═п╣п╟п╩я▄п╫п╟я▐
я│я┌я─я┐п╨я┌я┐я─п╟,
п©п╣я─п╣п╢п╟п╡п╟п╣п╪п╟я▐
я┤п╣я─п╣п╥
addr,
п╥п╟п╡п╦я│п╦я┌
п╬я┌
я│п╣п╪п╣п╧я│я┌п╡п╟
п╟п╢я─п╣я│п╬п╡.
п║я┌я─я┐п╨я┌я┐я─п╟
sockaddr
п╬п©я─п╣п╢п╣п╩я▐п╣я┌я│я▐
п╨п╟п╨-я┌п╬
я┌п╟п╨:
struct sockaddr {
sa_family_t sa_family;
char sa_data[14]; }
п∙п╢п╦п╫я│я┌п╡п╣п╫п╫я▀п╪ я│п╪я▀я│п╩п╬п╪ я█я┌п╬п╧ я│я┌я─я┐п╨я┌я┐я─я▀ я▐п╡п╩я▐п╣я┌я│я▐ п©я─п╣п╬п╠я─п╟п╥п╬п╡п╟п╫п╦п╣ я┐п╨п╟п╥п╟я┌п╣п╩я▐ я│я┌я─я┐п╨я┌я┐я─я▀, п©п╣я─п╣п╢п╟п╡п╟п╣п╪п╬пЁп╬ п╡ addr, я┤я┌п╬п╠я▀ п╦п╥п╠п╣п╤п╟я┌я▄ п©я─п╣п╢я┐п©я─п╣п╤п╢п╣п╫п╦п╧ п╨п╬п╪п©п╦п╩я▐я┌п╬я─п╟. п║п╪. п÷п═п≤п°п∙п═ п╫п╦п╤п╣.
п▓п·п≈п▓п═п░п╘п░п∙п°п·п∙ п≈п²п░п╖п∙п²п≤п∙¶
п÷я─п╦ я┐я│п©п╣я┬п╫п╬п╪ п╡я▀п©п╬п╩п╫п╣п╫п╦п╦ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ 0. п▓ я│п╩я┐я┤п╟п╣ п╬я┬п╦п╠п╨п╦ п╡п╬п╥п╡я─п╟я┴п╟п╣я┌я│я▐ -1, п╟ errno я┐я│я┌п╟п╫п╟п╡п╩п╦п╡п╟п╣я┌я│я▐ п╡ я│п╬п╬я┌п╡п╣я┌я│я┌п╡я┐я▌я┴п╣п╣ п╥п╫п╟я┤п╣п╫п╦п╣.
п·п╗п≤п▒п п≤¶
- EACCES
- п░п╢я─п╣я│ п╥п╟я┴п╦я┴я▒п╫, п╦п╩п╦ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▄ п╫п╣ я▐п╡п╩я▐п╣я┌я│я▐ я│я┐п©п╣я─п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩п╣п╪.
- EADDRINUSE
- пёп╨п╟п╥п╟п╫п╫я▀п╧ п╟п╢я─п╣я│ я┐п╤п╣ п╦я│п©п╬п╩я▄п╥я┐п╣я┌я│я▐.
- EBADF
- sockfd п╫п╣ я▐п╡п╩я▐п╣я┌я│я▐ п©я─п╟п╡п╦п╩я▄п╫я▀п╪ п╢п╣я│п╨я─п╦п©я┌п╬я─п╬п╪.
- EINVAL
- п║п╬п╨п╣я┌ я┐п╤п╣ п©я─п╦п╡я▐п╥п╟п╫ п╨ п╟п╢я─п╣я│я┐.
- ENOTSOCK
- sockfd я▐п╡п╩я▐п╣я┌я│я▐ п╢п╣я│п╨я─п╦п©я┌п╬я─п╬п╪ я└п╟п╧п╩п╟, п╟ п╫п╣ я│п╬п╨п╣я┌п╟.
п║п╩п╣п╢я┐я▌я┴п╦п╣ п╬я┬п╦п╠п╨п╦ я│п©п╣я├п╦я└п╦я┤п╫я▀ п╢п╩я▐ я│п╬п╨п╣я┌п╬п╡ п╢п╬п╪п╣п╫п╟ UNIX (AF_UNIX):
- EACCES
- п÷п╬п╦я│п╨ п╥п╟п©я─п╣я┴я▒п╫ п╦п╥-п╥п╟ п╬п╢п╫п╬пЁп╬ п╦п╥ я┤п╟я│я┌п╣п╧ п©я─п╣я└п╦п╨я│п╟ п©я┐я┌п╦ (п║п╪. я┌п╟п╨п╤п╣ path_resolution(7).)
- EADDRNOTAVAIL
- п≈п╟п©я─п╬я┬п╣п╫ п╫п╣я│я┐я┴п╣я│я┌п╡я┐я▌я┴п╦п╧ п╦п╫я┌п╣я─я└п╣п╧я│ п╦п╩п╦ п╥п╟п©я─п╟я┬п╦п╡п╟п╣п╪я▀п╧ п╟п╢я─п╣я│ п╫п╣ я▐п╡п╩я▐п╣я┌я│я▐ п╩п╬п╨п╟п╩я▄п╫я▀п╪.
- EFAULT
- addr я┐п╨п╟п╥я▀п╡п╟п╣я┌ п╡п╫п╣ п╟п╢я─п╣я│п╫п╬пЁп╬ п©я─п╬я│я┌я─п╟п╫я│я┌п╡п╟, п╢п╬я│я┌я┐п©п╫п╬пЁп╬ п©п╬п╩я▄п╥п╬п╡п╟я┌п╣п╩я▌.
- EINVAL
- п²п╣п©я─п╟п╡п╦п╩я▄п╫я▀п╧ п╟я─пЁя┐п╪п╣п╫я┌ addrlen, п╦п╩п╦ я│п╬п╨п╣я┌ п╫п╣ п©я─п╦п╫п╟п╢п╩п╣п╤п╦я┌ я│п╣п╪п╣п╧я│я┌п╡я┐ AF_UNIX.
- ELOOP
- п÷я─п╦ п╬п©я─п╣п╢п╣п╩п╣п╫п╦п╦ addr п©я─п╣п╡я▀я┬п╣п╫п╬ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п©п╣я─п╣я┘п╬п╢п╬п╡ п©п╬ я│п╦п╪п╡п╬п╩п╦я┤п╣я│п╨п╬п╧ я│я│я▀п╩п╨п╣.
- ENAMETOOLONG
- п░я─пЁя┐п╪п╣п╫я┌ addr я│п╩п╦я┬п╨п╬п╪ п╠п╬п╩я▄я┬п╬п╧.
- ENOENT
- п╓п╟п╧п╩ п╫п╣ я│я┐я┴п╣я│я┌п╡я┐п╣я┌.
- ENOMEM
- п²п╣п╢п╬я│я┌п╟я┌п╬я┤п╫п╬п╣ п╨п╬п╩п╦я┤п╣я│я┌п╡п╬ п©п╟п╪я▐я┌п╦ я▐п╢я─п╟.
- ENOTDIR
- п п╬п╪п©п╬п╫п╣п╫я┌ п╡ п©я─п╣я└п╦п╨я│п╣ п©я┐я┌п╦ п╫п╣ я▐п╡п╩я▐п╣я┌я│я▐ п╨п╟я┌п╟п╩п╬пЁп╬п╪.
- EROFS
- п÷п╬п©я▀я┌п╨п╟ я│п╬п╥п╢п╟п╫п╦я▐ inode я│п╬п╨п╣я┌п╟ п╫п╟ я└п╟п╧п╩п╬п╡п╬п╧ я│п╦я│я┌п╣п╪п╣, п╢п╬я│я┌я┐п©п╫п╬п╧ я┌п╬п╩я▄п╨п╬ п╢п╩я▐ я┤я┌п╣п╫п╦я▐.
п║п·п·п╒п▓п∙п╒п║п╒п▓п≤п∙ п║п╒п░п²п■п░п═п╒п░п°¶
SVr4, 4.4BSD, POSIX.1-2001 (bind() п╡п©п╣я─п╡я▀п╣ п©п╬я▐п╡п╦п╩я│я▐ п╡ 4.2BSD).
п≈п░п°п∙п╖п░п²п≤п╞¶
п▓ POSIX.1-2001 п╫п╣ я┌я─п╣п╠я┐п╣я┌я│я▐ п╡п╨п╩я▌я┤п╣п╫п╦п╣ <sys/types.h>, п╦ я█я┌п╬я┌ п╥п╟пЁп╬п╩п╬п╡п╬я┤п╫я▀п╧ я└п╟п╧п╩ п╫п╣ я┌я─п╣п╠я┐п╣я┌я│я▐ п╡ Linux. п·п╢п╫п╟п╨п╬, п╫п╣п╨п╬я┌п╬я─я▀п╣ я│я┌п╟я─я▀п╣ (BSD) я─п╣п╟п╩п╦п╥п╟я├п╦п╦ я┌я─п╣п╠я┐я▌я┌ п╢п╟п╫п╫я▀п╧ я└п╟п╧п╩, п╦ п©п╣я─п╣п╫п╬я│п╦п╪я▀п╣ п©я─п╦п╩п╬п╤п╣п╫п╦я▐ п╢п╩я▐ п©я─п╣п╢п╬я│я┌п╬я─п╬п╤п╫п╬я│я┌п╦, п╡п╣я─п╬я▐я┌п╫п╬, п╡п╨п╩я▌я┤п╟я┌ п╣пЁп╬.
п╒я─п╣я┌п╦п╧ п╟я─пЁя┐п╪п╣п╫я┌ bind() п╡ п╢п╣п╧я│я┌п╡п╦я┌п╣п╩я▄п╫п╬я│я┌п╦ п╦п╪п╣п╣я┌ я┌п╦п© int (п╡ 4.x BSD, libc4 п╦ libc5). п║п╦я┌я┐п╟я├п╦я▐ п╫п╣я│п╨п╬п╩я▄п╨п╬ п╥п╟п©я┐я┌п╟п╩п╟я│я▄ я│ п╡п╡п╣п╢п╣п╫п╦п╣п╪ POSIX п╢п╩я▐ п╫п╣пЁп╬ п╬я┌п╢п╣п╩я▄п╫п╬пЁп╬ я┌п╦п©п╟ socklen_t, я┌п╟п╨п╤п╣ п╦я│п©п╬п╩я▄п╥я┐п╣п╪п╬пЁп╬ п╡ glibc. п║п╪. я┌п╟п╨п╤п╣ accept(2).
п·п╗п≤п▒п п≤¶
п²п╣ п╬п©п╦я│я▀п╡п╟я▌я┌я│я▐ п╡п╬п╥п╪п╬п╤п╫п╬я│я┌п╦, я│п╡я▐п╥п╟п╫п╫я▀п╣ я│ я─п╟п╠п╬я┌п╬п╧ п©я─п╬п╥я─п╟я┤п╫я▀я┘ п©я─п╬п╨я│п╦.
п÷п═п≤п°п∙п═¶
п÷я─п╦п╪п╣я─ п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦я▐ bind() я│ я│п╬п╨п╣я┌п╟п╪п╦ п╢п╬п╪п╣п╫п╟ Internet п╪п╬п╤п╫п╬ п╫п╟п╧я┌п╦ п╡ getaddrinfo(3).
п║п╩п╣п╢я┐я▌я┴п╦п╧ п©я─п╦п╪п╣я─ п©п╬п╨п╟п╥я▀п╡п╟п╣я┌ п╨п╟п╨ п©я─п╦п╡я▐п╥п╟я┌я▄ п©п╬я┌п╬п╨п╬п╡я▀п╧ я│п╬п╨п╣я┌ п╨ п╢п╬п╪п╣п╫я┐ Unix (AF_UNIX) п╦ п©я─п╦п╫п╦п╪п╟я┌я▄ я│п╬п╣п╢п╦п╫п╣п╫п╦я▐:
#include <sys/socket.h> #include <sys/un.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #define MY_SOCK_PATH "/somepath" #define LISTEN_BACKLOG 50 #define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) {
int sfd, cfd;
struct sockaddr_un my_addr, peer_addr;
socklen_t peer_addr_size;
sfd = socket(AF_UNIX, SOCK_STREAM, 0);
if (sfd == -1)
handle_error("socket");
memset(&my_addr, 0, sizeof(struct sockaddr_un));
/* Clear structure */
my_addr.sun_family = AF_UNIX;
strncpy(my_addr.sun_path, MY_SOCK_PATH,
sizeof(my_addr.sun_path) - 1);
if (bind(sfd, (struct sockaddr *) &my_addr,
sizeof(struct sockaddr_un)) == -1)
handle_error("bind");
if (listen(sfd, LISTEN_BACKLOG) == -1)
handle_error("listen");
/* п╒п╣п©п╣я─я▄ п╪я▀ п╪п╬п╤п╣п╪ п©я─п╦п╫п╦п╪п╟я┌я▄ п╡я┘п╬п╢я▐я┴п╦п╣ я│п╬п╣п╢п╦п╫п╣п╫п╦я▐ п©п╬ п╬п╢п╫п╬п╪я┐
я│ п©п╬п╪п╬я┴я▄я▌ accept(2) */
peer_addr_size = sizeof(struct sockaddr_un);
cfd = accept(sfd, (struct sockaddr *) &peer_addr,
&peer_addr_size);
if (cfd == -1)
handle_error("accept");
/* п п╬п╢ п╬п╠я─п╟п╠п╬я┌п╨п╦ п╡я┘п╬п╢я▐я┴п╣пЁп╬ я│п╬п╣п╢п╦п╫п╣п╫п╦я▐(п╧)... */
/* п∙я│п╩п╦ п╦п╪я▐ п©я┐я┌п╦ я│п╬п╨п╣я┌п╟, MY_SOCK_PATH, п╠п╬п╩я▄я┬п╣ п╫п╣ я┌я─п╣п╠я┐п╣я┌я│я▐,
я┌п╬ п╣пЁп╬ п╫я┐п╤п╫п╬ я┐п╢п╟п╩п╦я┌я▄ я│ п©п╬п╪п╬я┴я▄я▌ unlink(2) п╦п╩п╦ remove(3) */ }
п║п°п·п╒п═п≤п╒п∙ п╒п░п п√п∙¶
accept(2), connect(2), getsockname(2), listen(2), socket(2), getaddrinfo(3), getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(7)
2007-12-28 | Linux |